# 导入模块
import support
import moduleA
import sys
import traceback
# 从testmodule 包，导入suppor2t模块
# （一个.py文件，就是一个模块，suppor2t的模块全称为testmodule.suppor2t）
from testmodule import suppor2t
import testmodule
from testmodule2 import support3
import testmodule2
import testmodule3
from testmodule3 import support4
import MyError
from student import Student
import Teacher


def main() -> None:
   support.print_func("Runoob")
   moduleA.sayHello()
   # 测试自定义模块
   suppor2t.print_func2(222222)
   testmodule.suppor2t.print_func2(1111)
   testmodule2.support3.print_func3(33333)
   # testmodule3包下面的__init__.py本身就是一个模块，而它的模块名就是testmodule3
   testmodule3.iAmAmodule()
   testmodule3.support4.print_func4(44444)

   s = Student()
   s.prt()

   t = Teacher.Teacher()
   t.sayHello()

   print(testexception())


def testexception():
    try:
        res = 1/0
        #  res = 0 + 1
    # ZeroDivisionError as e是代表，捕获成对象，可以调用  ZeroDivisionError对象里面的各种方法和成员变量
    except ZeroDivisionError as e:
        # 异常栈
        traceback.print_exc()
        print("ZeroDivisionError======",e)
    except NameError as e:
        # 上升到上层处理，跟java的throw相似
        raise Exception("testexception方法出现NameError错误")
    except SyntaxError :
        # 直接省略异常类型，由解释器自己去处理
        raise
    except Exception as e:
        traceback.print_exc()
        # 可以打印异常的类型 Unexpected error: <class 'ZeroDivisionError'>
        print("Unexpected error:", sys.exc_info()[0])
    # except:
    #     #  不建议使用bare裸except
    else:
        print("try里面不发生异常才会被执行，发生异常就不会执行，有别于finally")
    finally:
        print("我一定会被执行，所以可以用我来释放资源")
    return "我想吃饭"


if __name__ == "__main__":
    main()
else:
    print("import test.py----")
